{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from keras.layers import Input, Dense, LSTM\n",
    "from keras.models import Model\n",
    "from keras.layers import *\n",
    "from keras.models import *\n",
    "from keras.optimizers import Adam\n",
    "from keras.callbacks import EarlyStopping"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "import time"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv(\"data/沪深300天级别数据.csv\",header=0,index_col=None,sep='\\s+',parse_dates=[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>time</th>\n",
       "      <th>open</th>\n",
       "      <th>close</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>volume</th>\n",
       "      <th>money</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2012-01-04</td>\n",
       "      <td>2361.50</td>\n",
       "      <td>2298.75</td>\n",
       "      <td>2365.99</td>\n",
       "      <td>2298.30</td>\n",
       "      <td>3434456700</td>\n",
       "      <td>32572551267</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2012-01-05</td>\n",
       "      <td>2290.78</td>\n",
       "      <td>2276.39</td>\n",
       "      <td>2316.66</td>\n",
       "      <td>2272.15</td>\n",
       "      <td>4301648000</td>\n",
       "      <td>37635272074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2012-01-06</td>\n",
       "      <td>2274.35</td>\n",
       "      <td>2290.60</td>\n",
       "      <td>2291.89</td>\n",
       "      <td>2254.57</td>\n",
       "      <td>3519899200</td>\n",
       "      <td>31079362325</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2012-01-09</td>\n",
       "      <td>2291.18</td>\n",
       "      <td>2368.57</td>\n",
       "      <td>2368.89</td>\n",
       "      <td>2271.72</td>\n",
       "      <td>5472734100</td>\n",
       "      <td>51478126954</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2012-01-10</td>\n",
       "      <td>2365.77</td>\n",
       "      <td>2447.35</td>\n",
       "      <td>2449.95</td>\n",
       "      <td>2361.28</td>\n",
       "      <td>8115498900</td>\n",
       "      <td>75249157103</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2012-01-11</td>\n",
       "      <td>2444.76</td>\n",
       "      <td>2435.61</td>\n",
       "      <td>2453.15</td>\n",
       "      <td>2423.32</td>\n",
       "      <td>5870567400</td>\n",
       "      <td>57587219272</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>2012-01-12</td>\n",
       "      <td>2426.82</td>\n",
       "      <td>2435.22</td>\n",
       "      <td>2464.38</td>\n",
       "      <td>2423.32</td>\n",
       "      <td>4712127500</td>\n",
       "      <td>47877407259</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>2012-01-13</td>\n",
       "      <td>2438.41</td>\n",
       "      <td>2394.33</td>\n",
       "      <td>2445.79</td>\n",
       "      <td>2374.55</td>\n",
       "      <td>4551399700</td>\n",
       "      <td>47228338588</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        time     open    close     high      low      volume        money\n",
       "0 2012-01-04  2361.50  2298.75  2365.99  2298.30  3434456700  32572551267\n",
       "1 2012-01-05  2290.78  2276.39  2316.66  2272.15  4301648000  37635272074\n",
       "2 2012-01-06  2274.35  2290.60  2291.89  2254.57  3519899200  31079362325\n",
       "3 2012-01-09  2291.18  2368.57  2368.89  2271.72  5472734100  51478126954\n",
       "4 2012-01-10  2365.77  2447.35  2449.95  2361.28  8115498900  75249157103\n",
       "5 2012-01-11  2444.76  2435.61  2453.15  2423.32  5870567400  57587219272\n",
       "6 2012-01-12  2426.82  2435.22  2464.38  2423.32  4712127500  47877407259\n",
       "7 2012-01-13  2438.41  2394.33  2445.79  2374.55  4551399700  47228338588"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head(8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2024, 7)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_feature = df[['close','open','high', 'low', 'volume', 'money']].astype('float')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "sample_num = df.shape[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_num = int(df.shape[0] * 0.8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_num = df.shape[0] - train_num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2024, 1619, 405)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sample_num,train_num,test_num"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1619, 6) (405, 6)\n"
     ]
    }
   ],
   "source": [
    "data_train = df_feature.iloc[:train_num, :]\n",
    "data_test = df_feature.iloc[train_num:, :]\n",
    "print(data_train.shape, data_test.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "MinMaxScaler(copy=True, feature_range=(0, 1))"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scaler = MinMaxScaler(feature_range=(0, 1))\n",
    "scaler.fit(data_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_train = scaler.transform(data_train)\n",
    "data_test = scaler.transform(data_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1619,) (405,)\n"
     ]
    }
   ],
   "source": [
    "data_train_y = np.array(df_feature.iloc[:train_num, 0])\n",
    "data_test_y = np.array(df_feature.iloc[train_num:, 0])\n",
    "print(data_train_y.shape, data_test_y.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "PAST_TIME_STEPS = 10\n",
    "NEXT_TIME_STEPS = 3"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train = np.array([data_train[i : i + PAST_TIME_STEPS, :] for i in range(0,data_train.shape[0] - (NEXT_TIME_STEPS+ PAST_TIME_STEPS),1)])\n",
    "X_test = np.array([data_test[i : i + PAST_TIME_STEPS, :] for i in range(0,data_test.shape[0] - (NEXT_TIME_STEPS+ PAST_TIME_STEPS),1)])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train_class = np.array([1 if data_train_y[i + PAST_TIME_STEPS + NEXT_TIME_STEPS] - data_train_y[i + PAST_TIME_STEPS] > 0 else 0 for i in range(0,data_train.shape[0] - (NEXT_TIME_STEPS+ PAST_TIME_STEPS),1)])\n",
    "y_test_class = np.array([1 if data_test_y[i + PAST_TIME_STEPS + NEXT_TIME_STEPS]- data_test_y[i + PAST_TIME_STEPS] > 0 else 0 for i in range(0,data_test.shape[0] - (NEXT_TIME_STEPS+ PAST_TIME_STEPS),1)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1606, 10, 6) (1606,) (392, 10, 6) (392,)\n"
     ]
    }
   ],
   "source": [
    "print(X_train.shape, y_train_class.shape, X_test.shape,y_test_class.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "INPUT_DIM = data_train.shape[1]\n",
    "output_dim = 1\n",
    "batch_size = 32 #每轮训练模型时，样本的数量\n",
    "epochs = 100 #训练60轮次\n",
    "hidden_size = 64\n",
    "lstm_units = 32"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(?, 1, 64)\n"
     ]
    }
   ],
   "source": [
    "inputs = Input(shape=(PAST_TIME_STEPS, INPUT_DIM))\n",
    "#drop1 = Dropout(0.3)(inputs)\n",
    "x = Conv1D(filters = 64, kernel_size = 1, activation = 'relu')(inputs)  #, padding = 'same'\n",
    "#x = Conv1D(filters=128, kernel_size=5, activation='relu')(output1)#embedded_sequences\n",
    "x = MaxPooling1D(pool_size = PAST_TIME_STEPS)(x)\n",
    "x = Dropout(0.1)(x)\n",
    "print(x.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(?, 64)\n"
     ]
    }
   ],
   "source": [
    "lstm_out = Bidirectional(LSTM(lstm_units, activation='relu'), name='bilstm')(x)\n",
    "#lstm_out = LSTM(lstm_units,activation='relu')(x)\n",
    "print(lstm_out.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "# ATTENTION PART STARTS HERE\n",
    "attention_probs = Dense(64, activation='sigmoid', name='attention_vec')(lstm_out)\n",
    "#attention_mul=layers.merge([stm_out,attention_probs], output_shape],mode='concat',concat_axis=1))\n",
    "attention_mul =Multiply()([lstm_out, attention_probs])\n",
    "#attention_mul = merge([lstm_out, attention_probs],output_shape=32, name='attention_mul', mode='mul')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "__________________________________________________________________________________________________\n",
      "Layer (type)                    Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      "input_1 (InputLayer)            (None, 10, 6)        0                                            \n",
      "__________________________________________________________________________________________________\n",
      "conv1d_1 (Conv1D)               (None, 10, 64)       448         input_1[0][0]                    \n",
      "__________________________________________________________________________________________________\n",
      "max_pooling1d_1 (MaxPooling1D)  (None, 1, 64)        0           conv1d_1[0][0]                   \n",
      "__________________________________________________________________________________________________\n",
      "dropout_1 (Dropout)             (None, 1, 64)        0           max_pooling1d_1[0][0]            \n",
      "__________________________________________________________________________________________________\n",
      "bilstm (Bidirectional)          (None, 64)           24832       dropout_1[0][0]                  \n",
      "__________________________________________________________________________________________________\n",
      "attention_vec (Dense)           (None, 64)           4160        bilstm[0][0]                     \n",
      "__________________________________________________________________________________________________\n",
      "multiply_1 (Multiply)           (None, 64)           0           bilstm[0][0]                     \n",
      "                                                                 attention_vec[0][0]              \n",
      "__________________________________________________________________________________________________\n",
      "dense_1 (Dense)                 (None, 1)            65          multiply_1[0][0]                 \n",
      "==================================================================================================\n",
      "Total params: 29,505\n",
      "Trainable params: 29,505\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n",
      "None\n"
     ]
    }
   ],
   "source": [
    "output_class = Dense(1, activation='sigmoid')(attention_mul)\n",
    "#output = Dense(10, activation='sigmoid')(drop2)\n",
    "\n",
    "model_class = Model(inputs=inputs, outputs=output_class)\n",
    "print(model_class.summary())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 1606 samples, validate on 392 samples\n",
      "Epoch 1/100\n",
      "1606/1606 [==============================] - 2s 1ms/step - loss: 0.6930 - acc: 0.5019 - val_loss: 0.6923 - val_acc: 0.5281\n",
      "Epoch 2/100\n",
      "1606/1606 [==============================] - 0s 120us/step - loss: 0.6925 - acc: 0.5255 - val_loss: 0.6920 - val_acc: 0.5281\n",
      "Epoch 3/100\n",
      "1606/1606 [==============================] - 0s 119us/step - loss: 0.6920 - acc: 0.5255 - val_loss: 0.6920 - val_acc: 0.5281\n",
      "Epoch 4/100\n",
      "1606/1606 [==============================] - 0s 123us/step - loss: 0.6921 - acc: 0.5255 - val_loss: 0.6921 - val_acc: 0.5281\n",
      "Epoch 5/100\n",
      "1606/1606 [==============================] - 0s 111us/step - loss: 0.6920 - acc: 0.5255 - val_loss: 0.6923 - val_acc: 0.5281\n",
      "Epoch 6/100\n",
      "1606/1606 [==============================] - 0s 119us/step - loss: 0.6919 - acc: 0.5255 - val_loss: 0.6924 - val_acc: 0.5281\n",
      "Epoch 7/100\n",
      "1606/1606 [==============================] - 0s 114us/step - loss: 0.6922 - acc: 0.5255 - val_loss: 0.6924 - val_acc: 0.5281\n",
      "Epoch 8/100\n",
      "1606/1606 [==============================] - 0s 114us/step - loss: 0.6919 - acc: 0.5255 - val_loss: 0.6924 - val_acc: 0.5281\n",
      "Epoch 9/100\n",
      "1606/1606 [==============================] - 0s 112us/step - loss: 0.6922 - acc: 0.5255 - val_loss: 0.6924 - val_acc: 0.5281\n",
      "Epoch 10/100\n",
      "1606/1606 [==============================] - 0s 118us/step - loss: 0.6920 - acc: 0.5255 - val_loss: 0.6924 - val_acc: 0.5281\n",
      "Epoch 11/100\n",
      "1606/1606 [==============================] - 0s 123us/step - loss: 0.6921 - acc: 0.5255 - val_loss: 0.6924 - val_acc: 0.5281\n",
      "Epoch 12/100\n",
      "1606/1606 [==============================] - 0s 125us/step - loss: 0.6920 - acc: 0.5255 - val_loss: 0.6924 - val_acc: 0.5281\n",
      "Epoch 00012: early stopping\n"
     ]
    }
   ],
   "source": [
    "#model_class.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
    "model_class.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['accuracy'])\n",
    "# simple early stopping\n",
    "es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=10)\n",
    "# fit model\n",
    "history_class = model_class.fit(X_train, y_train_class,validation_data=(X_test, y_test_class), epochs=epochs, batch_size=batch_size, shuffle=False, callbacks=[es])\n",
    "y_pred_class = model_class.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1606/1606 [==============================] - 0s 41us/step\n",
      "392/392 [==============================] - 0s 56us/step\n",
      "Train: 0.526, Test: 0.528\n"
     ]
    }
   ],
   "source": [
    "# evaluate the model\n",
    "_, train_acc = model_class.evaluate(X_train, y_train_class, verbose=1)\n",
    "_, test_acc = model_class.evaluate(X_test, y_test_class, verbose=1)\n",
    "print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# plot training history\n",
    "plt.plot(history_class.history['loss'], label='train')\n",
    "plt.plot(history_class.history['val_loss'], label='test')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:py35]",
   "language": "python",
   "name": "conda-env-py35-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
